home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / pctjjl86.arc / ANIMATE.ARC / INLINXOR.ASM < prev    next >
Assembly Source File  |  1986-04-16  |  3KB  |  97 lines

  1. ; *** Listing 6 ***
  2. ;
  3. ;Column inline code XOR graphics driver for putting rectangular 
  4. ; imagesinto the CGA's medium-resolution memory map.
  5. ;
  6. ; Note: AX,BX,CX,DX,BP,SI,DI destroyed.
  7. ;
  8. one    segment para public 'CODE'
  9.     assume    cs:one,ds:one,es:nothing
  10.     public    form_driver
  11. ;
  12. form_driver proc near
  13.     mov    di,[bx+even_line_screen_offset_table]  ;find offset of
  14.                            ; top line of image
  15.     add    di,cx     ;ES:DI now points to byte at which to put
  16.              ; the image's upper left corner
  17.     lodsb         ;get the height of the image
  18.     xor    ah,ah     ;make height into 16 bit value
  19.     shr    ax,1     ;divide by 2 to arrive at number of even/odd
  20.              ; line pairs in the image
  21.     mov    cx,ax     ;store count in CX
  22.     lodsb         ;get the width of the image in bytes
  23.     mov    bp,2000h ;calculate the amount to add after even scan
  24.     sub    bp,ax     ; lines are drawn to get to address of the
  25.              ; next scan line
  26.     mov    dx,1fb0h ;calculate amount to subtract after odd scan
  27.     add    dx,ax     ; lines are drawn to get to the address of 
  28.              ; the next scan line
  29.     mov    bx,ax     ;number of columns in image
  30.     shl    bx,1     ;convert into word table index
  31.     mov    bx,[bx+column_inline_vector_table-2]
  32. ;
  33. ;Code for calculating the memory address to start each line of the
  34. ; image, and calling the inline code which exclusive-ORs a line of the
  35. ; image into the screen
  36. ;
  37. next_two_lines:
  38.     call    bx    ;BX holds address of inline columns code
  39.     add    di,bp    ;calculate address to start next line of image
  40.     call    bx    ;process image for odd scan line
  41.     sub    di,dx    ;calculate address to start next line of image
  42.             ; the next line will be an even line
  43.     loop next_two_lines ;loop if any even/odd line pairs left
  44.     ret            ; if not, return to calling program
  45. ;
  46. ;Inline code for XORing a line of the image into the screen
  47. ;
  48. clabel     macro     x      ;this macro is used to label the inline code
  49. cline&x&:          ; entry points for number of columns to XOR
  50.     endm          ;
  51. ;
  52. x=10                  ;this code can handle an image up to 
  53.     rept    10        ; 10 bytes wide
  54.     clabel    %x      ;put in label for entry based on number of 
  55.               ; bytes in a column
  56.     lodsb          ;get the next byte from the object's image
  57.     xor    es:[di],al ; and XOR it with the value now at the 
  58.                ; screem position.
  59.     inc    di       ;point to next image byte in object's form
  60. x=x-1               ;adjust label number
  61.     endm
  62.     ret           ;this return is executed at the end of 
  63.                ; every line
  64. ;
  65. ;This table is used as an indirect address for jumping into
  66. ; the inline code for exclusive-ORing columns.
  67. ;
  68. column_inline_vector_table label word     ;there is no entry point for 
  69.                      ; 0 lines. Starting at 2 
  70.                      ; eliminates the need to  
  71.                      ; store a dummy entry point 
  72.                      ; address
  73. column_entry_address   macro   x     ;this macro is used to 
  74.          dw     cline&x&     ; generate the labels 
  75.          endm             ; correspinding to the inline 
  76.                      ; code entry points
  77. ;
  78. x=1
  79.     rept    10
  80.     column_entry_address   %x
  81. x=x+1
  82.     endm
  83. ;
  84. ;This table is used to find the offset of an even scan line in
  85. ; the memory map of the color graphics adapter in medium res mode.
  86. ;
  87. even_line_screen_offset_table label word
  88. x=0
  89.     rept    100    ;there are 100 even lines
  90.     dw    x*50h    ; each is 50h (80 decimal) long
  91. x=x+1
  92.     endm
  93. ;
  94. form_driver endp
  95. one    ends
  96.     end
  97.